﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Library.DAL;
using System.Data;

namespace Library.BLL
{
    public class ViagensController: BaseController
    {
        const string tableName = "VIAGENS";
        public ViagensController(): base(tableName) 
        {
        }

        public DataTable getPlacasVeiculos()
        {
            string query = " SELECT DISTINCT MTRANSP FROM VIAGENS WHERE (len(MTRANSP) = 8) ";
            return this.executeQuery(query);
        }

        public DataTable getViagensPorCliente(int idUsuario)
        {
            StringBuilder query = new StringBuilder();
            query.Append(" SELECT FORMAT(DT_SAIDA, 'MM/YYYY') AS PERIODO, FORMAT(DT_SAIDA, 'YYYYMM') AS ORDERED, COUNT(COD_VIAGEM) AS QTD_VIAGENS, SUM(VALOR_TOTAL) AS VALOR_TOTAL ");
            query.Append(" FROM VIAGENS "); 
            query.Append(" WHERE COD_PESSOA = ");
            query.Append(idUsuario);
            query.Append(" GROUP BY FORMAT(DT_SAIDA, 'MM/YYYY'), FORMAT(DT_SAIDA, 'YYYYMM')");
            query.Append("ORDER BY 2"); 

            return this.executeQuery(query.ToString());
        }

        /// <summary>
        /// Obtém Viagens por período
        /// </summary>
        /// <param name="periodo">Format MM/YYYY</param>
        /// <returns></returns>
        public DataTable getViagensPorPeriodo(string periodo)
        {
            StringBuilder query = new StringBuilder();
            query.Append(" SELECT DT_SAIDA & \" às \" & HR_SAIDA & \" até \" & DT_CHEGADA & \" às \" & HR_CHEGADA & \" para \" & NOME_CIDADE & \" - \" & SIGLA_ESTADO AS VIAGEM, COD_VIAGEM, \"01/\" & FORMAT(DT_SAIDA,'MM/YYYY') AS DT_RELATORIO, COD_PAGADOR");
            query.Append(" FROM   (SELECT  CIDADES.NOME_CIDADE,  "); 
            query.Append(" FORMAT(VIAGENS_1.DT_SAIDA, 'DD/MM/YYYY') AS DT_SAIDA, ");
            query.Append(" FORMAT(VIAGENS_1.HR_SAIDA, 'HH:MM') AS HR_SAIDA, ");
            query.Append(" FORMAT(VIAGENS_1.DT_CHEGADA, 'DD/MM/YYYY') AS DT_CHEGADA, ");
            query.Append(" FORMAT(VIAGENS_1.HR_CHEGADA, 'HH:MM') AS HR_CHEGADA, ");
            query.Append(" CIDADES.SIGLA_ESTADO,");
            query.Append(" VIAGENS_1.COD_VIAGEM,");
            query.Append(" VIAGENS_1.COD_PAGADOR");
            query.Append(" FROM    (CIDADES INNER JOIN VIAGENS VIAGENS_1 ON CIDADES.COD_CIDADE = VIAGENS_1.COD_CIDADE) ");
            query.Append(" WHERE   FORMAT(VIAGENS_1.DT_SAIDA, 'MM/YYYY') = '");
            query.Append(periodo);
            query.Append("') VIAGENS "); 

            return this.executeQuery(query.ToString());
        }

        /// <summary>
        /// Query utilizada para geração de Resumo de viagens do Ano
        /// </summary>
        /// <param name="ano">Formato YYYY. Ex:2011</param>
        /// <returns></returns>
        public DataTable getViagensAnoReportAno(String ano)
        {
            StringBuilder query = new StringBuilder();
            query.Append("SELECT 'De ' & FORMAT(VIAGENS.DT_SAIDA, 'DD/MM/YYYY') & ' a ' & FORMAT(VIAGENS.DT_CHEGADA, 'DD/MM/YYYY') ");
            query.Append("& ' - ' & CIDADES.NOME_CIDADE & ' - ' & CIDADES.SIGLA_ESTADO & ' - R$' & VIAGENS.VALOR_TOTAL AS DESCRICAO ");
            query.Append("FROM ((PESSOAL INNER JOIN ");
            query.Append("VIAGENS ON PESSOAL.COD_PESSOA = VIAGENS.COD_PESSOA) INNER JOIN ");
            query.Append("CIDADES ON VIAGENS.COD_CIDADE = CIDADES.COD_CIDADE) ");
            query.Append("WHERE  (FORMAT(VIAGENS.DT_SAIDA, 'YYYY') = '");
            query.Append(ano);
            query.Append("') ");
            query.Append("ORDER BY VIAGENS.DT_SAIDA, VIAGENS.DT_CHEGADA ");

            return this.executeQuery(query.ToString());
        }

        public DataTable createDataTable()
        {
            DataTable dt = new DataTable(tableName);
            dt.Columns.Add(new DataColumn("COD_VIAGEM", typeof(int)));
            dt.Columns.Add(new DataColumn("COD_PESSOA", typeof(int)));
            dt.Columns.Add(new DataColumn("NIVEL", typeof(string)));
            dt.Columns.Add(new DataColumn("INDICE_NIVEL", typeof(string)));
            dt.Columns.Add(new DataColumn("COD_CIDADE", typeof(int)));
            dt.Columns.Add(new DataColumn("COD_TIPO_LOCAL", typeof(int)));
            dt.Columns.Add(new DataColumn("DT_SAIDA", typeof(DateTime)));
            dt.Columns.Add(new DataColumn("DT_CHEGADA", typeof(DateTime)));
            dt.Columns.Add(new DataColumn("KM", typeof(string)));
            dt.Columns.Add(new DataColumn("MTRANSP", typeof(string)));
            dt.Columns.Add(new DataColumn("MOTIVO", typeof(string)));
            dt.Columns.Add(new DataColumn("COD_PAGADOR", typeof(int)));
            dt.Columns.Add(new DataColumn("UFESP", typeof(DateTime)));
            dt.Columns.Add(new DataColumn("ALOJAMENTO", typeof(DateTime)));
            dt.Columns.Add(new DataColumn("VALOR_TOTAL", typeof(DateTime)));
            dt.Columns.Add(new DataColumn("TIPO", typeof(DateTime)));
            dt.Columns.Add(new DataColumn("INCREMENTO", typeof(DateTime)));

            return dt;
        }

        public Int32 getNextCodigoViagem()
        {
            string query = " SELECT MAX(ID_VIAGEM) + 1 FROM " + tableName;
            return Convert.ToInt32((this.executeQuery(query)).Rows[0][0]);
        }
    }
}
